package com.lee.rabbitmq.exchange.topic;

import com.lee.rabbitmq.util.RabbitMqUtil;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * 使用topic策略交换机接收消息
 *
 * @author Lee
 * @createDate 2021/12/15 10:52
 */
public class Receive1 {
    public static void main(String[] args) {
        Connection connection = RabbitMqUtil.getConnection();
        Channel channel = null;
        try {
            channel = connection.createChannel();

            /**
             * Topic 类型的交换机也是消息一对多的一种交换机类型，它和fanout都能实现一个消息同时发送给多个队列
             * fanout更适合于使用在一个功能不同的进程来获取数据，例如手机App中的消息推送，一个App可能会还有很
             * 多个用户来进行安装然后他们都会启动一个随机的队列来接收着自己的数据
             * Topic更适合不同的功能模块来接收同一个消息，例如商城下单成功以后需要发送消息到队列中。例如RoutingKey
             * 为的order.success,物流系统监听订单order.*发票系统监听order.*
             *
             * Topic可以使用随机的队列名也可以使用一个明确的队列名，但是如果应用在和订单有关的功能中，建议是有个
             * 名取的队列名并且要求为持久化的队列
             */
            channel.queueDeclare("topicQueue01",true,false,false,null);
            //声明交换机
            channel.exchangeDeclare("topicExchange","topic",true);
            //绑定交换机
            channel.queueBind("topicQueue01","topicExchange","aa");

            /**
             * 监听某个队列并获取队列中的数据
             * 注意:
             *  当前被绑定的队列必须已经存在并正确地绑定到了某个交换机中
             */
            channel.basicConsume("topicQueue01",true,new DefaultConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message = new String(body);
                    System.out.println("消费者aa: "+message);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
